<?php
/**
 *  Name:    Users
 *  Type:    Controller
 *  About:   Пользователи системы
 *  Author:  Vlad Andreev <php.vlad@gmail.com>
 **/

namespace Users;

class Controller extends \Control\ControllerAncestor {
    
    private $repUser;
    private $repUserGroup;
    private $repUserPermission;
    
    public function __construct() {
        
        parent::__construct();
        
        $this->repUser = $this->em->getRepository('Users\Entities\User');
        $this->repUserGroup = $this->em->getRepository('Users\Entities\UserGroup');
        $this->repUserPermission = $this->em->getRepository('Users\Entities\UserPermission');
    }
    
    
    /*
     *  Actions
     */
    
    // Список пользователей
    public function listAction() {
        
        $form = new \Control\Forms;
        $form->setTitle('Пользователи ситемы управления');
        $form->setTemplate('list');
        $form->addHead(array(
            // array('width' => 1, 'text' => array('type'=>'checkbox','id'=>'all_check','action'=>'all_check();')),
            array('width' => 1),
            array('width' => 400, 'align'=>'left', 'text'=>'Имя'),
            array('width' => 400, 'align'=>'left', 'text'=>'Логин'),
            array('width' => 400, 'align'=>'left', 'text'=>'E-mail'),
            array('width' => 1),
            array('width' => 1)
        ));
        
        $rows = array();
        $users = $this->repUser->findBy(array());
        foreach ($users as $user) {
            /*$check  = array(
                'type'   => 'checkbox',
                'id'     => $user->id,
                'class'  => 'check_item',
                'attr'   => "align='center'"
            );*/
            
            $edit   = array(
                'type'   => 'link_img_edit',
                'href'   => '#Users/edit/'. $user->id
            );
            
            $login  = array(
                'type'   => 'link',
                'href'   => '#Users/edit/'. $user->id,
                'text'   => $user->login
            );
            
            $name   = array(
                'type'   => 'link',
                'href'   => '#Users/edit/'. $user->id,
                'text'   => $user->name
            );
            
            $email  = array(
                'type'   => 'link',
                'href'   => '#Users/edit/'. $user->id,
                'text'   => $user->email
            );
            
            $active = ($user->active == 1)
                ? array(
                    'type' => 'link_img_active',
                    'action' => "acDisable('User','". $user->id ."');")
                : array(
                    'type' => 'link_img_disable',
                    'action' => "acActivate('User','". $user->id ."');")
            ;
            
            $delete = array(
                'type'   => 'link_img_delete',
                'action' => "javascript: if (MsgOkCancel('Вы действительно хотите удалить этого пользователя?')) { acDelete('User','". $user->id ."'); }"
            );
            
            $rows[] = array(/*$check, */$edit, $name, $login, $email, $active, $delete);
        }
        
        $form->addRows($rows);
        
        /*$form->addFooter(array(
            'type'    => 'select',
            'id'      => 'select_list_options',
            'options' => array('delete_checked'=>'Удалить выбранные','delete_all'=>'Удалить все')
        ));
        
        $form->addFooter(array(
            'type'    => 'link',
            'text'    => 'Выполнить!',
            'action'  => "javascript: if (MsgOkCancel('Вы действительно хотите удалить этих пользователей?')) {delete_check_item('user');}"
        ));*/
        
        return $form->render();
    }
    
    // Список опций
    public function optionsAction() {
        
        $live = \Control\Live::getInstance();
        
        $json = array();
        
        if ($live->user->access(array('module'=>'users', 'action'=>'add')))
            $json[] = array('title'=>'Добавить пользователя', 'href'=>'#Users/add');
        
        $childs = array();
        $users = $this->repUser->findBy(array());
        foreach ($users as $user)
            $childs[] = array('title' => $user->name, 'href' => '#Users/edit/'. $user->id);
        
        if ($live->user->access(array('module'=>'users','action'=>'list')))
            $json[] = array('title'=>'Список пользователей', 'href'=>'#Users/list', 'childs'=>$childs);
        
        if (count($json) > 0)
            $json[] = array('title'=>' ');
        
        if ($live->user->access(array('module'=>'users', 'action'=>'add_group')))
            $json[] = array('title'=>'Добавить группу', 'href'=>'#Users/addGroup');
        
        if ($live->user->access(array('module'=>'users', 'action'=>'edit_group'))) {
            $childs = array();
            $groups = $this->repUserGroup->findBy(array(),array('id' => 'ASC'));
            foreach ($groups as $group)
                $childs[] = array('title' => $group->title, 'href' => '#Users/editGroup/'. $group->id);
        }
        
        if ($live->user->access(array('module'=>'users', 'action'=>'list_groups')))
            $json[] = array('title'=>'Группы пользователей', 'href'=>'#Users/listGroups', 'childs'=>$childs);
        
        if (count($json) > 0)
            $json[] = array('title'=>' ');
        
        if ($live->user->access(array('module'=>'users', 'action'=>'add_permission')))
            $json[] = array('title'=>'Добавить разрешение', 'href'=>'#Users/addPermission');
        
        if ($live->user->access(array('module'=>'users','action'=>'list_permissions')))
            $json[] = array('title'=>'Список разрешений', 'href'=>'#Users/listPermissions');
        
        // $json[] = array('title'=>'Настройки', 'href'=>'#Users/settings');
        
        return json_encode($json);
    }
    
    // Форма добавления пользователя
    public function addAction() {
        
        $user = new \Users\User;
        
        $form = $user->getForm(array(
            'title' => 'Добавить пользователя',
            'values' => array()
        ));
        
        return $form->render();
    }
    
    // Форма редактирования пользователя
    public function editAction($id = null) {
        
        $user = new \Users\User;
        $item = $user->find(intval($id));
        
        if (!$item) {
            $form = new \Control\Forms;
            $form->setTitle('Пользователь не найден');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="#Users/list">← Вернуться к списку пользователей</a>');
            
            return $form->render();
        }
        
        $form = $user->getForm(array(
            'title' => 'Редактировать пользователя',
            'values' => $item,
        ));
        
        return $form->render();
    }
    
    // Save data
    public function saveAction($data_name, $id = null) {
        
        $live = \Control\Live::getInstance();
        
        $id = intval($id);
        $data = $live->_post;
        
        switch($data_name) {
            
            case 'User': {
                
                if (empty($id) && !$live->user->access(array('module' => 'Users', 'action' => 'add'))) 
                    $this->statusForbidden('У Вас недостаточно прав для этого действия. Пожалуйста, обратитесь к администратору.');
                elseif($id == $live->user->id && !$live->user->access(array('module' => 'Users', 'action' => 'profile_edit')))
                    $this->statusForbidden('У Вас недостаточно прав для этого действия. Пожалуйста, обратитесь к администратору.');
                elseif($id != $live->user->id && !$live->user->access(array('module' => 'Users', 'action' => 'edit')))
                    $this->statusForbidden('У Вас недостаточно прав для этого действия. Пожалуйста, обратитесь к администратору.');
                
                if (!empty($id))
                    $user = new \Users\User(array('id' => $id));
                else
                    $user = new \Users\User;
                
                $errors = $user->validate($data);
                if (!empty($errors))
                    return $this->statusError($errors[0]);
                
                $user->save($data);
                
                break;
            }
            case 'UserGroup': {
                
                $group = new \Users\UserGroup;
                $group->save($data, $id);
                
                break;
            }
            case 'UserPermission': {
                
                $permission = new \Users\UserPermission;
                $permission->save($data, $id);
                
                break;
            }
        }
        
        return $this->statusOk();
    }
    
    // Удалить
    public function deleteAction($entity, $id) {
        
        $id = intval($id);
        
        $model = '\Users\\'. $entity;
        
        $data = new $model;
        $data->delete($id);
        
        return $this->statusOk();
    }
    
    // Activate action
    public function activateAction($entity, $id) {
        
        $id = intval($id);
        
        $model = '\Users\\'. $entity;
        
        $data = new $model(array('id' => $id));
        $data->save(array('active' => 1));
        
        return $this->statusOk();
    }
    
    // Disable action
    public function disableAction($entity, $id) {
        
        $id = intval($id);
        
        $model = '\Users\\'. $entity;
        
        $data = new $model;
        $data = new $model(array('id' => $id));
        $data->save(array('active' => 0));
        
        return $this->statusOk();
    }
    
    // Список групп пользователей
    public function listGroupsAction() {
        
        $form = new \Control\Forms;
        $form->setTitle('Группы пользователей');
        $form->setTemplate('list');
        $form->addHead(array(
            array('width' => 1),
            array('width' => 400, 'align' => 'left', 'text' => 'Название'),
            array('width' => 1)
        ));
        
        $rows = array();
        $groups = $this->repUserGroup->findBy(array(), array('id' => 'ASC'));
        foreach ($groups as $group) {
            $edit = array(
                'type'   => 'link_img_edit',
                'href'   => '#Users/editGroup/'. $group->id
            );
            
            $title = array(
                'type'   => 'link',
                'href'   => '#Users/editGroup/'. $group->id,
                'text'   => $group->title
            );
            
            $delete = array(
                'type'   => 'link_img_delete',
                'action' => "javascript: if (MsgOkCancel('Действительно удалить?')) { acDelete('UserGroup','". $group->id ."'); }"
            );
            
            $rows[] = array($edit, $title, $delete);
        }
        
        $form->addRows($rows);
        
        return $form->render();
    }
    
    // Форма добавления группы
    public function addGroupAction() {
        
        $data = new \Data\Data;
        $data->setName('UserGroup');
        $output = $data->addForm(array(
            'title' => 'Добавить группу',
            'redirect' => 'listGroups'
        ));
        
        return $output;
    }
    
    // Форма редактирования группы пользователей
    public function editGroupAction($id = null) {
        
        $group = new \Users\UserGroup;
        $item = $group->find(intval($id));
        
        if (!$item) {
            $form = new \Control\Forms;
            $form->setTitle('Группа не найдена');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="#Users/listGroups">← Вернуться к списку групп</a>');
            
            return $form->render();
        }
        
        $form = $group->getForm(array(
            'title' => 'Редактирование группы',
            'values' => $item,
        ));
        
        return $form->render();
    }
    
    // Список разрешений
    public function listPermissionsAction() {
        $form = new \Control\Forms;
        $form->setTitle('Разрешения для пользователей');
        
        $modules = $this->em->getrepository('Modules\Entities\Module')->findBy(array());
        foreach ($modules as $module) {
            $permissions = $this->repUserPermission->findBy(
                array('module' => $module->name)
            );
            
            if (!empty($permissions)) {
                $link = new \stdClass;
                $link->type = 'link';
                $link->action = "if($('#module_permissions_". $module->name ."').css('display')=='block')$('#module_permissions_". $module->name ."').hide(); else $('#module_permissions_". $module->name ."').show();";
                $link->text = $module->title;
                $link->style = "border-bottom:1px dashed grey";
                $form->addObject($link);
                
                $form->addHTML('<br/><ul id="module_permissions_'. $module->name .'" style="display:block; list-style:none">');
                foreach ($permissions as $permission) {
                    $form->addHTML('<li>');
                    
                    $edit = new \stdClass;
                    $edit->type = 'link_img_edit';
                    $edit->href = '#Users/editPermission/'. $permission->id;
                    $form->addObject($edit);
                    
                    $delete = new \stdClass;
                    $delete->type = 'link_img_delete';
                    $delete->action = "javascript: if (MsgOkCancel('Вы действительно хотите удалить это разрешение?')) { acDelete('UserPermission','". $permission->id ."'); }";
                    $form->addObject($delete);
                    
                    $link = new \stdClass;
                    $link->type = 'link';
                    $link->href = '#Users/editPermission/'. $permission->id;
                    $link->text = $permission->title;
                    $form->addObject($link);
                    
                    $form->addHTML('</li>');
                }
                
                $form->addHTML('</ul><br/>');
            }
        }
        
        return $form->render();
    }
    
    // Форма добавления разрешения
    public function addPermissionAction() {
        
        $data = new \Data\Data;
        $data->setName('UserPermission');
        $output = $data->addForm(array(
            'title' => 'Добавить разрешение',
            'redirect' => 'listPermissions'
        ));
        
        return $output;
    }
    
    // Форма редактирования разрешения
    public function editPermissionAction($id) {
        
        $permission = new \Users\UserPermission;
        $item = $permission->find(intval($id));
        
        if (!$item) {
            $form = new \Control\Forms;
            $form->setTitle('Разрешение не найдено');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="#Users/listPermissions">← Вернуться к списку разрешений</a>');
            
            return $form->render();
        }
        
        $data = new \Data\Data;
        $data->setName('UserPermission');
        $data->setData($item);
        
        $output = $data->editForm(array(
            'title' => 'Редактировать разрешение',
            'deleteQuestion' => 'Вы действительно хотите удалить это разрешение?',
            'redirect' => 'listPermissions'
        ));
        
        return $output;
    }
    
    // проверка авторизации
    public function authAction() {
        
        $live = \Control\Live::getInstance();
        
        $output = json_encode(array(
            'auth' => $live->user->authorized
        ));
        
        return $output;
    }
    
    // Форма регистрации
    public function registrationAction(){
        
        $live = \Control\Live::getInstance();
        
        $live->_data_need_template = true;
        $live->_data_need_theme = true;
        
        $this->data['title'] = 'Регистрация';
        
        $messages = array();
        $errors = array();
        
        if(!empty($_POST)) {
            $data = array(
                'login' => filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING),
                'name'  => (!empty($_POST['name']))
                    ? filter_var(trim($_POST['name']), FILTER_SANITIZE_STRING)
                    : filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING)
                ,
                'email' => filter_var(trim($_POST['email']), FILTER_SANITIZE_STRING),
                'pass'  => filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING),
                'pass2' => filter_var(trim($_POST['pass2']), FILTER_SANITIZE_STRING),
            );
            
            if (!empty($_POST['city']))
                $data['city'] = filter_var(trim($_POST['city']), FILTER_SANITIZE_STRING);
            
            $errors = $live->user->validateRegistration($data);
            
            if(empty($errors)) {
                $data = $live->user->prepareRegistration($data);
                
                $user = new \Users\User;
                $user->save($data, $id);
                
                $messages[] = 'Регистрация прошла успешно';
                
                $data = array(
                    'user_login' => filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING),
                    'user_hash'  => md5(filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING)),
                );
                $user->auth($data);
                
                if(empty($errors)) {
                    if($_SERVER['HTTP_REFERER']  != 'http://'. $_SERVER['HTTP_HOST'] .'/users/registration')
                        header('location: '. $_SERVER['HTTP_REFERER']);
                    else
                        header('location: /');
                }
            }
            
            $this->data['errors'] = $errors;
            $this->data['messages'] = $messages;
            $this->data['users_registration_data'] = $data;
        }
        
        return $this->data;
    }
    
    // Форма авторизации
    public function authorizationAction() {
        
        $live = \Control\Live::getInstance();
        
        $live->_data_need_template = true;
        $live->_data_need_theme = true;
        
        $this->data['title'] = 'Авторизация';
        
        $errors = array();
        
        if(!empty($_POST)) {
            $data = array(
                'user_login' => filter_var(trim($_POST['email']), FILTER_SANITIZE_STRING),
                'user_hash'  => filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING),
            );
            
            if (empty($data['user_login']) || empty($data['user_hash']))
                $errors[] = 'Все поля обязательны для заполнения';
            
            if(empty($errors)) {
                $data['user_hash'] = md5($data['user_hash']);
                
                $user = new \Users\User;
                $auth = $user->auth($data);
                
                if($auth) {
                    if($_SERVER['HTTP_REFERER']  != 'http://'. $_SERVER['HTTP_HOST'] .'/users/authorization')
                        header('location: '. $_SERVER['HTTP_REFERER']);
                    else
                        header('location: /');
                } else {
                    $errors[] = 'Неверные логин и пароль';
                }
            }
            
            $this->data['errors'] = $errors;
            $this->data['users_authorization_data'] = $data;
        }
        
        return $this->data;
    }
    
    // Форма настроек
    public function settingsAction() {
        
        $live = \Control\Live::getInstance();
        
        $live->_data_need_template = true;
        $live->_data_need_theme = true;
        
        $this->data['title'] = 'Настройки';
        
        $messages = array();
        $errors = array();
        
        if(!empty($_POST)) {
            $data = array(
                'login' => filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING),
                'name'  => (!empty($_POST['name']))
                    ? filter_var(trim($_POST['name']), FILTER_SANITIZE_STRING)
                    : filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING)
                ,
                'email' => filter_var(trim($_POST['email']), FILTER_SANITIZE_STRING),
                'pass'  => filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING),
                'pass2' => filter_var(trim($_POST['pass2']), FILTER_SANITIZE_STRING),
            );
            
            if (!empty($_POST['data']))
                $data['data'] = json_encode($_POST['data']);
            
            $errors = $live->user->validateSettings($data);
            
            if(empty($errors)) {
                $data = $live->user->prepareSettings($data);
                
                $live->user->save($data);
                
                if(empty($errors)) {
                    if($data['login'] != $live->user->login)
                        $_SESSION['user_login'] = $data['login'];
                    
                    header('location: '. $_SERVER['HTTP_REFERER']);
                }
            }
            
            $this->data['errors'] = $errors;
            $this->data['messages'] = $messages;
            $this->data['users_registration_data'] = $data;
        }
        
        return $this->data;
    }
    
    // Форма авторизации
    public function loginAction() {
        
        $live = \Control\Live::getInstance();
        $live->_data_need_template = true;
        
        $this->data['user_login'] = (!empty($_SESSION['user_login'])) ? $_SESSION['user_login'] : '';
        
        return $this->data;
    }
    
    public function logoutAction() {
        
        $user = new \Users\User;
        $user->logout();
        
        header('location:/');
    }
    
    public function profileAction() {
        
        $live = \Control\Live::getInstance();
        
        if (empty($live->user->id)) {
            $form = new \Control\Forms;
            $form->setTitle('Пользователь не найден');
            $form->setTemplate('form');
            $form->addHTML('<br/>К сожалению, по Вашему запросу ничего не найдено.<br/><br/><a class="js-link" href="/control">← Вернуться на главную страницу</a>');
            
            return $form->render();
        }
        
        $form = $live->user->getProfileForm(array(
            'title' => 'Профиль',
            'values' => $live->user,
        ));
        
        return $form->render();
    }
    
    
    /*
     *  Blocks
     */
    
    public function userinfoBlock() {
        
        $user = new \Users\User;
        
        $data = ($user->auth())
            ? array('login' => $user->login, 'name' => $user->name)
            : array()
        ;
        
        return $data;
    }
    
    public function userlinksBlock() {
        
        $user = new \Users\User;
        
        $data = ($user->auth())
            ? array('login' => $user->login)
            : array()
        ;
        
        return $data;
    }
    
    public function authorizationBlock() {
        
        $live = \Control\Live::getInstance();
        
        return array(
            'auth' => ($live->user->id > 0)
        );
    }
    
    public function registrationBlock() {
        
        $live = \Control\Live::getInstance();
        
        return array(
            'auth' => ($live->user->id > 0)
        );
    }
    
    public function settingsBlock() {
        
        $live = \Control\Live::getInstance();
        
        $output = array(
            'auth' => ($live->user->id > 0),
        );
        
        if ($live->user->id > 0) {
            $output['login'] = $live->user->login;
            $output['email'] = $live->user->email;
            $output['data'] = (array)$live->user->data;
        }
        
        return $output;
    }
}